package CAPA_LOGICA_DE_NEGOCIO;

import CAPA_ENLACE_DE_DATOS.AD_ENLACE_DATOS;
import RECURSOS.ENTIDAD;
import RECURSOS.ERROR;
import RECURSOS.FACTURA;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class LN_LOGICA_NEGOCIO {
    
    AD_ENLACE_DATOS obj_conexion= new AD_ENLACE_DATOS();

    public void guardar(ENTIDAD obj_entidad)
    {
        String sql;
        ERROR error = new ERROR();        
        if(obj_entidad.getCodigo()==0){
            sql= obj_entidad.Insertar(); 
        }
        else
        {            
            sql = obj_entidad.Actualizar();            
        }        
        obj_entidad.setCodigo(obj_conexion.ejecutar_int(sql,error));
        obj_entidad.setError(error);        
    }
    
    public void guardarprod(ENTIDAD obj_entidad)
    {
        
        ERROR error = new ERROR();                
        
        String sql1 = obj_entidad.getModelo().getMarca().consultar_codigo();                                    
        obj_entidad.getModelo().getMarca().setCodigo(obj_conexion.ejecutar_int(sql1,error));        
        obj_entidad.getModelo().getMarca().setError(error);                                       
        
        guardar(obj_entidad.getModelo()); 
        
        String sql2 = obj_entidad.getTipo_prod().consultar_codigo();        
        obj_entidad.getTipo_prod().setCodigo(obj_conexion.ejecutar_int(sql2,error));
        obj_entidad.getTipo_prod().setError(error);
        
        guardar(obj_entidad);                        
    }       
    
    public DefaultTableModel consultar_todo(ENTIDAD obj_entidad)
    {
        String sql = obj_entidad.consultar_todo();
        ERROR error = new ERROR();                               
        ResultSet rs = obj_conexion.ejecutar_q(sql,error);
        obj_entidad.setError(error);        
        
        if(error.getDescripcion_error() == null){                              
            DefaultTableModel modelo=new DefaultTableModel();
            try
            {
                ResultSetMetaData metadatos= rs.getMetaData();                    
                int numeroColumnas = metadatos.getColumnCount();                    
                Object[] etiquetas = new Object[numeroColumnas];
                for (int i = 0; i < numeroColumnas; i++)
                {                        
                       etiquetas[i] = metadatos.getColumnLabel(i + 1); 
                }
                modelo.setColumnIdentifiers(etiquetas);
                while (rs.next())
                {                       
                       Object [] fila = new Object[numeroColumnas];                       
                       for (int i=0;i<numeroColumnas;i++)
                       {
                           fila[i] = rs.getObject(i+1);
                       }                       
                       modelo.addRow(fila); 
                }                    
                return modelo;                                                      
            }
            catch(SQLException e)
            {
                obj_entidad.getError().setDescripcion_error(e.getMessage());
                obj_entidad.getError().setTipo_error("SQL");
                return null;            
            }    
        }                    
        else{
            return null;        
        }
    
    }
    
    public DefaultTableModel consultar_prodf(ENTIDAD obj_entidad)
    {
        String sql = obj_entidad.consultar_todo();
        ERROR error = new ERROR();
        ResultSet rs = obj_conexion.ejecutar_q(sql,error);
        obj_entidad.setError(error);
        
        if(error.getDescripcion_error() == null){
            DefaultTableModel modelo=new DefaultTableModel(){public boolean isCellEditable(int row, int column) {
            return false;
        }};;
            
            try
            {                                
                Object[] etiquetas = new Object[4];
                
                etiquetas[0] = "CODIGO";            
                etiquetas[1] = "CANTIDAD";           
                etiquetas[2] = "DESCRIPCION";        
                etiquetas[3] = "PVP";
                int j;
                
                modelo.setColumnIdentifiers(etiquetas);
                
                while (rs.next())
                {                                           
                       j=0;
                       Object [] fila = new Object[4];                       
                       for (int i=0;i<3;i++)
                       {                                                      
                           if(i==2)
                           {                               
                               fila[j] = String.valueOf(rs.getObject(i+1))+" "+String.valueOf(rs.getObject(i+2))+" "+String.valueOf(rs.getObject(i+3));
                               j++;
                               fila[j] = rs.getObject(i+4);
                           }
                           else
                           {                               
                               fila[j] = rs.getObject(i+1);
                           }                                                      
                           j++;                                                     
                       }
                       modelo.addRow(fila); 
                }                                                                                           
                return modelo;                                                                  
            }
            catch(SQLException e)
            {
                obj_entidad.getError().setDescripcion_error(e.getMessage());
                obj_entidad.getError().setTipo_error("SQL");
                return null;            
            }    
        }                    
        else{
            return null;        
        }
    
    }
    
    public DefaultComboBoxModel consultar_combo(ENTIDAD obj_entidad)
    {
        String sql = obj_entidad.consultar_desc();
        ERROR error = new ERROR();
        ResultSet rs = obj_conexion.ejecutar_q(sql,error);
        obj_entidad.setError(error);
        
        DefaultComboBoxModel modelo=new DefaultComboBoxModel();
        try
        {                        
            while (rs.next()) {
                modelo.addElement(rs.getObject(1));
            }            
            return modelo;            
        }
        catch(SQLException e)
        {
            obj_entidad.getError().setDescripcion_error(e.getMessage());
            obj_entidad.getError().setTipo_error("SQL");
            return null;            
        } 
    }
        
    public void buscarprod(ENTIDAD obj_entidad)
    {
         
         ERROR error = new ERROR();
         
         String sql1 = obj_entidad.getTipo_prod().consultar_codigo();         
         obj_entidad.getTipo_prod().setCodigo(obj_conexion.ejecutar_int(sql1, error));         
         obj_entidad.getTipo_prod().setError(error);
                           
         String sql2 = obj_entidad.getModelo().consultar_codigo();         
         obj_entidad.getModelo().setCodigo(obj_conexion.ejecutar_int(sql2, error));         
         obj_entidad.getModelo().setError(error);
                                     
         String sql3 = obj_entidad.consultar_codigo();
         obj_entidad.setCodigo(obj_conexion.ejecutar_int(sql3, error));
         obj_entidad.setError(error);                     
         
         String sql4 = obj_entidad.buscar();          
         ResultSet resultado = obj_conexion.ejecutar_q(sql4, error);
         obj_entidad.setError(error);
         try
         {
            resultado.next();
            obj_entidad.setCantidad(Integer.parseInt(resultado.getString("CANTIDAD")));
            obj_entidad.setCosto(Double.parseDouble(resultado.getString("COSTO")));
            obj_entidad.setPrecio_venta(Double.parseDouble(resultado.getString("PRECIOVENTA")));
            obj_entidad.setDescripcion_prod(resultado.getString("DESCRIPCIONPROD"));
            
         }
         catch(SQLException e)
         {             
             error.setDescripcion_error(e.getMessage());                                                                    
             error.setTipo_error("SQL");
             obj_entidad.setError(error);
         }
    }
    
     public void buscarclif(ENTIDAD obj_entidad)
    {         
         ERROR error = new ERROR();
         
         String sql4 = obj_entidad.buscar();          
         ResultSet resultado = obj_conexion.ejecutar_q(sql4, error);
         obj_entidad.setError(error);
         try
         {
            resultado.next();
            obj_entidad.setCodigo(Integer.parseInt(resultado.getString("CODCLIENTE")));
            obj_entidad.setNombrec(resultado.getString("NOMBREC"));
            obj_entidad.setApellidoc(resultado.getString("APELLIDOC"));
            obj_entidad.setDireccionc(resultado.getString("DIRECCIONC"));
            obj_entidad.setTelefonoc(resultado.getString("TELEFONOC"));                        
         }
         catch(SQLException e)
         {             
             error.setDescripcion_error(e.getMessage());                                                                    
             error.setTipo_error("SQL");
             obj_entidad.setError(error);
         }
    }
    
    public void consultarcod(ENTIDAD obj_entidad)
    {
         ERROR error = new ERROR();
        
         String sql1 = obj_entidad.consultar_codigo();         
         obj_entidad.setCodigo(obj_conexion.ejecutar_int(sql1, error));         
         obj_entidad.setError(error);         
    }
    
    public String error_usuario(ERROR err)
    {
        String e=err.getDescripcion_error();                
        if(e.indexOf(
                "function insertar_modelo"
                ) !=-1) 
        {
            return ("NO SE PUEDE INGRESAR EL MISMO MODELO");
        }        
        if(e.indexOf(
                "function insertar_tipo_producto"
                ) !=-1)                             
        {                        
            return ("NO SE PUEDE INGRESAR EL MISMO TIPO DE PRODUCTO");
        }
        if(e.indexOf("conexión falló")!=-1 || e.indexOf("Conexión rechazada")!=-1)
        {
                return ("NO HAY CONEXION CON LA BASE DE DATOS");
        }        
        
        if(e.indexOf(
                "No se encuentra el reporte"
                )!=-1)
        {
                return ("NO SE ENCUENTRA EL REPORTE");
        }        
        if(e.indexOf(
                "data not found at :"
                )!=-1)
        {
                return ("NO SE ENCUENTRA LA IMAGEN DEL REPORTE EN LOS RECURSOS");
        }        
        
        if(e.indexOf("no se puede ingresar un valor menor")!=-1)
        {        
            return ("Valor menor o igual al de la ultima factura".toUpperCase());
        }        
        
        return "HA OCURRIDO UN ERROR DE TIPO"+err.getTipo_error();
    }    
    public JasperPrint ejecutar_reporte(String reporte,ERROR error)
    {                
        if(obj_conexion.establecerconexion()== null)
        {
            String archivo=System.getProperty("user.dir")+"\\src\\RECURSOS\\"+reporte;                    
            if (archivo==null)        
            {        
                error.setDescripcion_error("No se encuentra el reporte en el directorio especificado");           
                error.setTipo_error("FileNotFound");
                return null;
            }        
            JasperReport masterReport=null;        
            try                   
            {                         
                masterReport=(JasperReport)JRLoader.loadObject(archivo);                                                
                JasperPrint jasperprint=JasperFillManager.fillReport(masterReport,null,obj_conexion.getConexion());
                return(jasperprint);
            }        
            catch(JRException e)        
            {        
                error.setDescripcion_error(e.getMessage());            
                error.setTipo_error("Java Report");                                        
                return(null);
            }
        }    
        error.setTipo_error(obj_conexion.establecerconexion().getTipo_error());
        error.setDescripcion_error(obj_conexion.establecerconexion().getDescripcion_error());
        return null;        
    }    
    
    
    public JasperPrint parametros(String reporte,ERROR error,FACTURA fac){
            
        String sql = fac.Reporte();
        ResultSet resultado = obj_conexion.ejecutar_q(sql, error);
        if(obj_conexion.establecerconexion()== null)
        {   
               
                String NombreC="";
                String DireccionC="";
                String telfC="";
                String CI="";
                String vendedor="";
                String subtotal="";
                String iva="";
                String descuento="";
                String total="";
               try
                {                             
                    resultado.next();
                    NombreC =  resultado.getString("NOMBREC")+" "+resultado.getString("APELLIDOC");
                    DireccionC = resultado.getString("DIRECCIONC");
                    telfC = resultado.getString("TELEFONOC");
                    if(telfC == null)
                    {
                        telfC="";
                    }
                    CI = resultado.getString("CICLIENTE");
                    vendedor=resultado.getString("NOMBREV")+" "+resultado.getString("APELLIDOV");
                    subtotal=resultado.getString("SUBTOTAL");
                    iva=resultado.getString("IVA");
                    descuento=resultado.getString("DESCUENTO");
                    if (descuento == null)
                    {
                        descuento ="";
                    }
                    total=resultado.getString("TOTAL");
                }
                catch(SQLException e)
                {             
                    error.setDescripcion_error(e.getMessage());                                                                    
                    error.setTipo_error("SQL");
                    System.out.println("error1");
                   
                }                          
            String archivo=System.getProperty("user.dir")+"\\src\\RECURSOS\\"+reporte;                    
            if (archivo==null)        
            {        
                error.setDescripcion_error("No se encuentra el reporte en el directorio especificado");           
                error.setTipo_error("FileNotFound");
                return null;
            }        
            JasperReport masterReport=null;        
            try                   
            {                  
                
               masterReport=(JasperReport)JRLoader.loadObject(archivo);
               HashMap parametros = new HashMap();
                parametros.put("COD_FACTURA",fac.getCodigo());
                parametros.put("N_CLIENTE",NombreC);
                parametros.put("DIR_CLIENTE",DireccionC);
                parametros.put("TELF_CLIENTE",telfC);
                parametros.put("CI_CLIENTE",CI);
                parametros.put("VENDEDOR",vendedor);
                parametros.put("SUBTOTAL",subtotal);
                parametros.put("IVA",iva);
                parametros.put("DESCUENTO",descuento);
                 parametros.put("TOTAL",total);
                JasperPrint jasperprint=JasperFillManager.fillReport(masterReport,parametros,obj_conexion.getConexion());
                
               return(jasperprint);
             
            }        
            catch(JRException e)        
            {        
                error.setDescripcion_error(e.getMessage());            
                error.setTipo_error("Java Report");
                System.out.println("error2");
                return(null);
            }
            
               
        }    
        error.setTipo_error(obj_conexion.establecerconexion().getTipo_error());
        error.setDescripcion_error(obj_conexion.establecerconexion().getDescripcion_error());
        return null;        
    }
    
    public void guardarnumFac(FACTURA fac, int numero)
    {
        ERROR error = new ERROR(); 
        String sql2 = "SELECT \"CODFACTURA\"  FROM \"FACTURA\" ORDER BY \"CODFACTURA\"";
        ResultSet rs = obj_conexion.ejecutar_q(sql2,error);
        int n=0 ;
        DefaultTableModel modelo=new DefaultTableModel();
        if(error.getDescripcion_error() == null){                                                     
               try
               {
                    ResultSetMetaData metadatos= rs.getMetaData();                    
                    int numeroColumnas = metadatos.getColumnCount();                    
                    Object[] etiquetas = new Object[numeroColumnas];
                    for (int i = 0; i < numeroColumnas; i++)
                    {                        
                           etiquetas[i] = metadatos.getColumnLabel(i + 1); 
                    }
                    modelo.setColumnIdentifiers(etiquetas);
                    while (rs.next())
                    {                       
                           Object [] fila = new Object[numeroColumnas];                       
                           for (int i=0;i<numeroColumnas;i++)
                           {
                               fila[i] = rs.getObject(i+1);
                           }                       
                           modelo.addRow(fila); 
                    }                                                                                                                     

                   int contador = modelo.getRowCount();
                    n = Integer.parseInt(String.valueOf(modelo.getValueAt(contador-1, 0)));
                    if (n<numero)
                    {        String sql = fac.NumeroFacs(numero);
                             obj_conexion.ejecutar(sql,error);
                    }
                    else
                    {                                                
                        fac.getError().setDescripcion_error( "no se puede ingresar un valor menor al numero de la ultima factura");
                        fac.getError().setTipo_error("Valor menor al de la ultima factura");
                    }
               }               
                catch(SQLException | ArrayIndexOutOfBoundsException e)
                {
                    fac.getError().setDescripcion_error(e.getMessage());
                    fac.getError().setTipo_error("SQL");
                }
           }
           else {
                fac.setError(error);
           }
           
    }
//Guardar clientes hecho por lucho    
        public void guardar(ENTIDAD obj_entidad1, ENTIDAD obj_entidad2)
    {
        ERROR error = new ERROR();
        String sql= obj_entidad2.consultar_codigo();
        obj_entidad2.setCodigo(obj_conexion.ejecutar_int(sql, error));
        obj_entidad2.setError(error);
        //obj_entidad1.setTipo_cli((TIPO_CLIENTE) obj_entidad2);
        guardar(obj_entidad1);
    }

        public  void cargaReporte(String iReport_jasper, String marca,String tipo)
    {
      
        if(obj_conexion.establecerconexion()== null)
        {
            ERROR error = new ERROR();
//        generaReportes g = new generaReportes();
//        g.generaReportes_ve(sql, iReport_jasper, ve_parameters);
         
                try{       
//        String reporte="C:/Reportes/"+iReport_jasper+".jrxml";
          String reporte=System.getProperty("user.dir")+"\\src\\RECURSOS\\factura.jasper";
          
        System.out.println(reporte);
        JasperReport jasperReport=JasperCompileManager.compileReport(reporte);
        HashMap parametros = new HashMap();
//        for(int x=0;x<veParameters.length;x++)
//        {
//            parameters.put(veParameters[x][0],veParameters[x][1]);
//        }
        //parameters.put("marca", marca);
        //parameters.put("tipo", tipo);
        
        //Map<String, String> parametros = new HashMap<String, String>();
        parametros.put("N_CLIENTE", "Juan");
        parametros.put("DIR_CLIENTE", "Reporte Participantes");
        //parametros.put("TELF_CLIENTE", );
        //parametros.put("DIR_CLIENTE", "Reporte Participantes");
        
        JasperPrint jasperPrint=JasperFillManager.fillReport(jasperReport,parametros,obj_conexion.getConexion());
        JasperViewer.viewReport(jasperPrint);
        JasperViewer jviewer=new JasperViewer(jasperPrint,false);
        
        jviewer.setTitle("SOVI");         
        jviewer.setVisible(true);        
        }catch(JRException e){
            System.out.println(e);
            
        }
        }
    }
      // no se puede hacer un select en la logica           
       
        
        
        
        //ULTIMO LUCHO 
        public void generaReporte (String N_Reporte,Date par1,Date par2)      
        {
              ERROR con;              
              con=obj_conexion.establecerconexion();
              try
              {              
                  String reporte=System.getProperty("user.dir")+"\\src\\RECURSOS\\"+N_Reporte+".jasper";             

                  System.out.println(reporte);
                  JasperReport masterReport=null;                      
                  masterReport=(JasperReport)JRLoader.loadObject(reporte);
                  HashMap parametros=new HashMap();
                  parametros.put("p1",par1);
                  parametros.put("p2",par2);
                  JasperPrint jasperprint=JasperFillManager.fillReport(masterReport,parametros,obj_conexion.getConexion());
                  JasperViewer.viewReport(jasperprint);                    
              }
              catch(JRException e){
                  System.out.print(e);
              }
      }
       
        public void generaReporte (String N_Reporte,String par1,String par2)      
        {
              ERROR con;              
              con=obj_conexion.establecerconexion();
              try
              {              
                  String reporte=System.getProperty("user.dir")+"\\src\\RECURSOS\\"+N_Reporte+".jasper";             

                  System.out.println(reporte);
                  JasperReport masterReport=null;                      
                  masterReport=(JasperReport)JRLoader.loadObject(reporte);
                  HashMap parametros=new HashMap();
                  parametros.put("p1",par1);
                  parametros.put("p2",par2);
                  JasperPrint jasperprint=JasperFillManager.fillReport(masterReport,parametros,obj_conexion.getConexion());
                  JasperViewer.viewReport(jasperprint);                    
              }
              catch(JRException e){
                  System.out.print(e);
              }
      }
        
        
}
